#pragma once
#include <iostream>
#include <string>
#include <unordered_map>
#include <cstring>
#include <cassert>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "send.hpp"
#include "epoll.hpp"
#define PRO_NUM 1024
class Por
{
public:
    // 默认构造函数
    Por()
    {
        _request += "./wwwroot";
        memset(_buffer, 0, PRO_NUM);
    }
    // 切割请求字符串并且发送
    void Cut(std::string &request, std::string &respon, std::unordered_map<int,Data*>::iterator cur)
    {
        // auto pos = request.find("\r\n");
        // assert(pos != std::string::npos);
        // std::string newrequest = request.substr(0, pos);
        // auto lpos = newrequest.find(" ");
        // assert(lpos != std::string::npos);
        // auto rpos = newrequest.find(" ");
        // assert(rpos != std::string::npos);
        // std::string road = newrequest.substr(lpos + 1, newrequest.size() - lpos - rpos);
        // _request += road;
        // Find(respon);
        respon = request;
        request.clear();
        SendRespon::OpenofOoff(cur->first, true, cur->second->_e);
    }
    //寻找路径,判断此路径是否存在
    void Find(std::string &respon)
    {
        // 路径存在
        int fd = open(_request.c_str(), O_RDONLY);
        // 路径存在
        if(fd > 0)
            respon = Res(fd);
        // 路径不存在
        else
            respon = NotRoad(fd);
    }
    // 构建响应
    std::string Res(int fd)
    {
        while(true)
        {
            ssize_t s = read(fd, _buffer, PRO_NUM - 1);
            if(s < 0)
            {
                std::cout << "read fail:" << strerror(errno) << errno << std::endl;
                exit(12);
            }
            else
            {
                _buffer[s] = '\0';
                _respon += "HTTP/1.1 200 OK\r\n";
                _respon += "\r\n";
                _respon += _buffer;
            }
        }
        // 关闭本地文件描述符
        close(fd);
        // 返回响应
        return _respon;
    }
    std::string NotRoad(int fd)
    {
        // 路径不存在
        _respon += "HTTP/1.1 404 Notfound\r\n";
        _respon += "\r\n";
        close(fd);
        return _respon;
    }

private:
    char _buffer[PRO_NUM];
    std::string _request;
    std::string _respon;
};